#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <signal.h>

static int fd = 0;
/*
 * SIGIO信号处理函数
 * @param - signum 	: 信号值
 * @return 			: 无
 */
static void sigio_signal_func(int signum)
{
    // 通过信号去读取值
	char val = 0;
    int ret = 0;
    ret = read(fd, &val, 1);
    printf("val = %x\n", val);
    printf("ret = %d\n", ret);
}

int main(int argc,char **argv)
{ 
    int flags = 0;

    fd = open("/dev/eint_key", O_RDONLY);
    if (fd < 0) {
        printf("open failed \n");
        return -1;
    }

	signal(SIGIO, sigio_signal_func);
	/*对文件设置属主, 
		告诉文件fd 如果有了内核信号之后,发给 getpid指定的进程*/
	fcntl(fd, F_SETOWN, getpid());
	/*
		设置文件支持 异步模式
		file flags 32bit, 每一个bit表示一种属性   其中有一个bit表示
		该fd是不是支持 异步模式 1-支持 0-不支持
	*/
	flags = fcntl(fd, F_GETFL, 0);
	flags |= FASYNC;
	fcntl(fd,F_SETFL,flags);

	while(1) {
		sleep(2);
	}

    close(fd);

    return 0;
}